package com.wu.filter;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

/**ZuulFilter类里面的方法执行顺序：
 * filterType程序最先进入这个方法，第二个进入方法是filterOrder ，第三额方法是shouldFilter，第四run方法
 */
@Component
public class Filter  extends  ZuulFilter{

	@Override
	public boolean shouldFilter() {
		// TODO Auto-generated method stub
		return false;//这里为true表示应该过滤， 才会执行run()方法，，false不执行
	}

	//在run方法中我们定义了该过滤器应该做的事情。
	@Override
	public Object run() throws ZuulException {
		RequestContext requestContext = RequestContext.getCurrentContext();
		HttpServletRequest httpServletRequest = requestContext.getRequest();
		System.out.println(httpServletRequest.getMethod() + "  请求url= " + httpServletRequest.getRequestURL());
		String token = httpServletRequest.getParameter("token");
		if(token != null) {
			return null;  //null  表示请求可以放行 
		}
		requestContext.setSendZuulResponse(false);
		requestContext.setResponseStatusCode(401);
		try {
			requestContext.getResponse().getWriter().write("token is enpty");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;//null  表示请求可以放行 
	}

	
	
	
//	　Spring Cloud的API网关不但可以实现类似NGINX+Lua强大的路由分发，实现动静页面的分流，更重要可以实现对所有发往后端微服务请求的拦截。Zuul主要有四种类型的过滤器，我们可以为特定的url模式添加任意数量的过滤器。
//
//	 “pre” 预过滤器 - 在路由分发一个请求之前调用。  这个意思就是：在接口调用之前，就是接口还未被调用  就走过滤器
//	 “post” 后过滤器 - 在路由分发一个请求后调用。   这个意思就是：在接口调用完之后再走过滤器
//	 “route” 路由过滤器 - 用于路由请求分发。
//	 “error” 错误过滤器 - 在处理请求时发生错误时调用
//
//	 上图显示这几种过滤器的前后调用顺序，第一个是pre过滤器然后是Route过滤器，最后响应是post过滤器。
//
//	 下面我们开始演示这几种过滤器的开发，Springcloud的开发三板斧就是pom.xml、application配置和元注解三种，首先pom.xml如下：
//	 ————————————————
//	 版权声明：本文为CSDN博主「JAVA@架构」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
//	 原文链接：https://blog.csdn.net/weixin_44048532/article/details/87918865
	@Override
	public String filterType() {
		//   // 过滤器类型   pre   post
		return "pre";  // 这里必须设置  成 pre  ，，程序最先进入这个方法，第二个进入方法是filterOrder ，第三额方法是shouldFilter，第四run方法
	}

	@Override
	public int filterOrder() {
		// TODO Auto-generated method stub
		return 0;      // 过滤的顺序  0  1  2  分别代表什么   还没试过
	}

}
